/*
多态是程序员“将变化的事物与不变的事物分离”的一项重要技术。
 */

class Instrument {
    void play() {
        System.out.println("play");
    }

    void adjust() {
        System.out.println("adjust");
    }

    String what() {
        return "Instrument";
    }
}


class Wind extends Instrument {
    @Override
    void play() {
        System.out.println("Wind.play()");
    }

    @Override
    void adjust() {
        System.out.println("Wind.adjust()");
    }

    @Override
    String what() {
        return "Wind";
    }
}

class Percussion extends Instrument {
    @Override
    void play() {
        System.out.println("Percussion.play()");
    }

    @Override
    void adjust() {
        System.out.println("Percussion.adjust()");
    }

    @Override
    String what() {
        return "Percussion";
    }
}

class Stringed extends Instrument {
    @Override
    void play() {
        System.out.println("Stringed.play()");
    }

    @Override
    void adjust() {
        System.out.println("Stringed.adjust()");
    }

    @Override
    String what() {
        return "Stringed";
    }
}

class Brass extends Wind {
    @Override
    void play() {
        System.out.println("Brass.play()");
    }

    @Override
    void adjust() {
        System.out.println("Brass.adjust()");
    }
}

class Woodwind extends Wind {
    @Override
    void play() {
        System.out.println("Woodwind.play()");
    }

    @Override
    String what() {
        return "Woodwind";
    }
}

public class MusicPlay {
    public static void tune(Instrument i) {
        i.play();
    }

    public static void tuneAll(Instrument[] e) {
        for (Instrument i : e) {
            tune(i);
        }
    }

    public static void main(String[] args) {
        Instrument[] orchestra = {
                new Wind(),
                new Percussion(),
                new Stringed(),
                new Brass(),
                new Woodwind()
        };
        tuneAll(orchestra);
    }
}
/*
tune()方法完全不了解周围发生的任何代码变更，但它仍然可以正常工作。这正是多态应该提供的。
 */